package com.thz.admin.controller.svg;

import com.thz.common.dto.svg.ConversionFileToSvgRequestDTO;
import com.thz.common.dto.svg.ConversionFileToSvgResponseDTO;
import com.thz.common.result.Result;
import com.thz.common.utils.IpUtils;
import com.thz.system.service.svg.IConversionFileToSvgService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 文件转SVG控制器
 * 
 * @author THZ
 * @date 2025
 */
@Slf4j
@RestController
@RequestMapping("/api/conversion/fileToSvg")
@Tag(name = "SVG转换", description = "文件转SVG相关接口")
public class ConversionFileToSvgController {
    
    @Autowired
    private IConversionFileToSvgService conversionService;
    
    /**
     * 上传文件并转换为彩色矢量SVG
     * 使用彩色位图描摹技术，保留原图色彩
     * 
     * @param file 图像文件（支持JPG、PNG、GIF等格式）
     * @param width SVG宽度（可选，建议800-1200）
     * @param height SVG高度（可选，建议600-1000）
     * @param keepAspectRatio 是否保持宽高比（默认true）
     * @param colorCount 颜色数量（1-256，默认16。简单图标8-16，插画16-32，复杂图像32-64）
     * @param precision 矢量化精度（1-10，默认5。值越高越精细但文件越大）
     * @param request HTTP请求对象
     * @return 转换结果，包含彩色SVG的下载URL
     */
    @PostMapping("/upload")
    @Operation(summary = "上传文件并转换为彩色矢量SVG", 
               description = "上传图像文件，使用彩色位图描摹技术转换为保留色彩的矢量SVG。" +
                           "支持调节颜色数量和精度以平衡质量和文件大小。")
    public Result<ConversionFileToSvgResponseDTO> uploadAndConvert(
            @RequestParam("file") MultipartFile file,
            @RequestParam(value = "width", required = false) Integer width,
            @RequestParam(value = "height", required = false) Integer height,
            @RequestParam(value = "keepAspectRatio", required = false, defaultValue = "true") Boolean keepAspectRatio,
            @RequestParam(value = "colorCount", required = false, defaultValue = "256") Integer colorCount,
            @RequestParam(value = "precision", required = false, defaultValue = "5") Integer precision,
            HttpServletRequest request) {
        
        log.info("收到文件转SVG请求: filename={}, size={}, contentType={}, width={}, height={}, colorCount={}, precision={}", 
                file.getOriginalFilename(), file.getSize(), file.getContentType(), width, height, colorCount, precision);
        
        // 快速验证文件是否为空
        if (file.isEmpty()) {
            log.warn("上传文件为空");
            return Result.error("上传文件不能为空");
        }
        
        // 构建请求参数
        ConversionFileToSvgRequestDTO requestDTO = new ConversionFileToSvgRequestDTO();
        requestDTO.setWidth(width);
        requestDTO.setHeight(height);
        requestDTO.setKeepAspectRatio(keepAspectRatio);
        requestDTO.setColorCount(colorCount);
        requestDTO.setPrecision(precision);
        
        // 获取客户端IP
        String ipAddress = IpUtils.getClientIp(request);
        
        // 执行转换
        ConversionFileToSvgResponseDTO responseDTO = conversionService.convertFileToSvg(file, requestDTO, ipAddress);
        
        return Result.success("文件转换成功", responseDTO);
    }
    
    /**
     * 查询转换记录
     * 
     * @param id 记录ID
     * @return 转换记录
     */
    @GetMapping("/{id:\\d+}")
    @Operation(summary = "查询转换记录", description = "根据ID查询转换记录详情")
    public Result<ConversionFileToSvgResponseDTO> getConversionRecord(@PathVariable Long id) {
        ConversionFileToSvgResponseDTO responseDTO = conversionService.getConversionRecord(id);
        return Result.success(responseDTO);
    }
    
    /**
     * 查询最近的转换记录
     * 
     * @param limit 数量限制（默认20）
     * @return 转换记录列表
     */
    @GetMapping("/recent")
    @Operation(summary = "查询最近的转换记录", description = "查询最近的转换记录列表")
    public Result<List<ConversionFileToSvgResponseDTO>> getRecentConversions(
            @RequestParam(value = "limit", required = false, defaultValue = "20") int limit) {
        List<ConversionFileToSvgResponseDTO> list = conversionService.getRecentConversions(limit);
        return Result.success(list);
    }
    
    /**
     * 删除转换记录
     * 
     * @param id 记录ID
     * @return 删除结果
     */
    @DeleteMapping("/{id:\\d+}")
    @Operation(summary = "删除转换记录", description = "删除转换记录及相关文件")
    public Result<Void> deleteConversion(@PathVariable Long id) {
        conversionService.deleteConversion(id);
        return Result.success("删除成功", null);
    }
}


